#!/bin/bash
# ============================================================================
# CentOS 7 安装兼容浏览器（解决 GLIBC 版本不兼容问题）
# ============================================================================
#
# 功能说明：
#   自动检测 GLIBC 版本，并安装兼容 CentOS 7 的浏览器
#   支持安装：Firefox（推荐）、Chrome 114.x（兼容版本）、Chromium
#
# 使用方法：
#   sudo ./tools/install_browser_centos7.sh [firefox|chrome|chromium]
#
# 参数说明：
#   firefox   - 安装 Firefox（默认，推荐）
#   chrome    - 安装兼容的 Chrome 114.x
#   chromium  - 安装 Chromium（从 EPEL）
#
# 注意事项：
#   - 需要 root 权限
#   - 仅适用于 CentOS 7.x
#
# ============================================================================

set -e
set -u

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查是否为 root 用户
if [ "$EUID" -ne 0 ]; then
    log_error "此脚本需要 root 权限"
    log_info "请使用: sudo $0"
    exit 1
fi

# 检查系统类型
if [ ! -f /etc/redhat-release ]; then
    log_error "此脚本仅适用于 CentOS/RHEL 系统"
    exit 1
fi

# 检查 GLIBC 版本
log_info "检查 GLIBC 版本..."
GLIBC_VERSION=$(ldd --version 2>&1 | head -n1 | grep -oP '\d+\.\d+' | head -n1 || echo "未知")
log_info "当前 GLIBC 版本: $GLIBC_VERSION"

if [ "$GLIBC_VERSION" != "未知" ]; then
    GLIBC_MAJOR=$(echo $GLIBC_VERSION | cut -d. -f1)
    GLIBC_MINOR=$(echo $GLIBC_VERSION | cut -d. -f2)
    
    if [ "$GLIBC_MAJOR" -lt 2 ] || ([ "$GLIBC_MAJOR" -eq 2 ] && [ "$GLIBC_MINOR" -lt 25 ]); then
        log_warning "⚠️  GLIBC 版本过低（$GLIBC_VERSION），无法安装最新版 Chrome"
        log_info "推荐使用 Firefox 或兼容版本的 Chrome 114.x"
    fi
fi

log_info "=========================================="
log_info "CentOS 7 浏览器安装工具"
log_info "=========================================="
log_info ""

# 解析参数
BROWSER_TYPE=${1:-firefox}

case "$BROWSER_TYPE" in
    firefox)
        log_info "选择安装：Firefox（推荐）"
        ;;
    chrome)
        log_info "选择安装：Google Chrome 114.x（兼容版本）"
        ;;
    chromium)
        log_info "选择安装：Chromium"
        ;;
    *)
        log_error "未知的浏览器类型: $BROWSER_TYPE"
        log_info "支持的选项: firefox, chrome, chromium"
        exit 1
        ;;
esac

# 安装 Firefox
install_firefox() {
    log_info "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
    log_info "开始安装 Firefox..."
    log_info "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
    
    # 检查是否已安装
    if command -v firefox &> /dev/null; then
        # 提取版本号，忽略警告信息
        local version=$(firefox --version 2>&1 | grep -oP 'Mozilla Firefox \K[\d.]+' || echo "未知")
        if [ "$version" = "未知" ]; then
            # 尝试另一种方式提取版本
            version=$(firefox --version 2>&1 | grep -i firefox | grep -oP '\d+\.\d+\.\d+' | head -1 || echo "未知")
        fi
        log_warning "Firefox 已安装: $version"
        read -p "是否重新安装? (y/N): " -n 1 -r
        echo
        if [[ ! $REPLY =~ ^[Yy]$ ]]; then
            log_info "已取消"
            return 0
        fi
    fi
    
    # 安装依赖
    log_info "安装依赖..."
    yum install -y wget bzip2 >/dev/null 2>&1 || true
    
    # 下载 Firefox
    log_info "下载 Firefox（这可能需要一些时间）..."
    cd /tmp
    if [ -f firefox-latest.tar.bz2 ]; then
        rm -f firefox-latest.tar.bz2
    fi
    
    # Firefox 下载 URL 列表（多个源）
    FIREFOX_URLS=(
        "https://download-installer.cdn.mozilla.net/pub/firefox/releases/latest/linux-x86_64/zh-CN/firefox-latest.tar.bz2"
        "https://download-installer.cdn.mozilla.net/pub/firefox/releases/latest/linux-x86_64/en-US/firefox-latest.tar.bz2"
        "https://ftp.mozilla.org/pub/firefox/releases/latest/linux-x86_64/zh-CN/firefox-latest.tar.bz2"
        "https://ftp.mozilla.org/pub/firefox/releases/latest/linux-x86_64/en-US/firefox-latest.tar.bz2"
    )
    
    # 验证下载的文件
    validate_firefox_download() {
        local file="$1"
        local min_size=50000000  # 50MB，Firefox 应该至少 50MB
        
        if [ ! -f "$file" ]; then
            return 1
        fi
        
        local file_size=$(stat -c%s "$file" 2>/dev/null || echo 0)
        if [ "$file_size" -lt "$min_size" ]; then
            log_warning "文件太小 (${file_size} 字节)，应该至少 50MB"
            return 1
        fi
        
        # 检查文件类型
        if ! file "$file" | grep -qE "(bzip2|compressed)"; then
            log_warning "文件格式不正确，不是压缩文件"
            return 1
        fi
        
        # 尝试验证 tar 结构
        if ! tar -tjf "$file" >/dev/null 2>&1; then
            log_warning "tar 文件结构验证失败"
            return 1
        fi
        
        return 0
    }
    
    # 尝试下载
    local download_success=false
    for url in "${FIREFOX_URLS[@]}"; do
        log_info "尝试下载: $(basename $url)"
        if wget --timeout=60 --tries=2 -q "$url" -O firefox-latest.tar.bz2 2>&1; then
            if validate_firefox_download firefox-latest.tar.bz2; then
                local size=$(stat -c%s firefox-latest.tar.bz2 2>/dev/null || echo 0)
                local size_mb=$((size / 1024 / 1024))
                log_success "✅ 下载成功 (${size_mb} MB)"
                download_success=true
                break
            else
                log_warning "下载的文件无效，尝试下一个源..."
                rm -f firefox-latest.tar.bz2
            fi
        else
            log_warning "下载失败，尝试下一个源..."
            rm -f firefox-latest.tar.bz2
        fi
    done
    
    # 如果 wget 失败，尝试使用 curl
    if [ "$download_success" = false ] && command -v curl &> /dev/null; then
        log_info "wget 失败，尝试使用 curl..."
        for url in "${FIREFOX_URLS[@]}"; do
            log_info "尝试 curl 下载: $(basename $url)"
            if curl -L --connect-timeout 60 --max-time 300 -s -o firefox-latest.tar.bz2 "$url" 2>&1; then
                if validate_firefox_download firefox-latest.tar.bz2; then
                    local size=$(stat -c%s firefox-latest.tar.bz2 2>/dev/null || echo 0)
                    local size_mb=$((size / 1024 / 1024))
                    log_success "✅ 下载成功 (${size_mb} MB)"
                    download_success=true
                    break
                else
                    log_warning "下载的文件无效，尝试下一个源..."
                    rm -f firefox-latest.tar.bz2
                fi
            else
                log_warning "curl 下载失败，尝试下一个源..."
                rm -f firefox-latest.tar.bz2
            fi
        done
    fi
    
    if [ "$download_success" = false ]; then
        log_error "❌ 所有下载源均失败"
        log_info ""
        log_info "请手动下载 Firefox："
        log_info "  1. 访问: https://www.mozilla.org/firefox/download/"
        log_info "  2. 选择 Linux 64-bit 版本"
        log_info "  3. 下载后上传到服务器 /tmp 目录"
        log_info "  4. 运行: tar -xjf /tmp/firefox-*.tar.bz2"
        log_info "  5. 运行: sudo mv firefox /opt/"
        log_info "  6. 运行: sudo ln -sf /opt/firefox/firefox /usr/local/bin/firefox"
        exit 1
    fi
    
    # 解压并安装
    log_info "解压并安装 Firefox..."
    if [ -d firefox ]; then
        rm -rf firefox
    fi
    tar -xjf firefox-latest.tar.bz2
    
    # 移动到 /opt
    if [ -d /opt/firefox ]; then
        mv /opt/firefox /opt/firefox.backup.$(date +%Y%m%d_%H%M%S) 2>/dev/null || true
    fi
    mv firefox /opt/
    
    # 创建软链接
    ln -sf /opt/firefox/firefox /usr/local/bin/firefox
    ln -sf /opt/firefox/firefox /usr/bin/firefox 2>/dev/null || true
    
    # 清理
    rm -f /tmp/firefox-latest.tar.bz2
    
    # 验证安装
    if command -v firefox &> /dev/null; then
        # 提取版本号，忽略警告信息
        local version=$(firefox --version 2>&1 | grep -oP 'Mozilla Firefox \K[\d.]+' || echo "未知")
        if [ "$version" = "未知" ]; then
            version=$(firefox --version 2>&1 | grep -i firefox | grep -oP '\d+\.\d+\.\d+' | head -1 || echo "未知")
        fi
        log_success "✅ Firefox 安装成功"
        log_info "版本: $version"
        log_info "安装路径: /opt/firefox"
        log_info "运行命令: firefox"
    else
        log_error "❌ Firefox 安装失败"
        exit 1
    fi
}

# 安装 Chrome（兼容版本）
install_chrome() {
    log_info "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
    log_info "开始安装 Google Chrome 114.x（兼容版本）..."
    log_info "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
    
    # 检查是否已安装
    if command -v google-chrome &> /dev/null || command -v chrome &> /dev/null; then
        log_warning "Chrome 已安装"
        read -p "是否重新安装? (y/N): " -n 1 -r
        echo
        if [[ ! $REPLY =~ ^[Yy]$ ]]; then
            log_info "已取消"
            return 0
        fi
    fi
    
    # 安装依赖
    log_info "安装依赖..."
    yum install -y wget libXScrnSaver alsa-lib GConf2 >/dev/null 2>&1 || true
    
    # 下载兼容版本的 Chrome
    log_info "下载 Chrome 114.x（兼容 CentOS 7 的最后一个版本）..."
    cd /tmp
    
    # Chrome 114.x 下载链接（兼容 GLIBC 2.17）
    CHROME_URL="https://dl.google.com/linux/chrome/rpm/stable/x86_64/google-chrome-stable-114.0.5735.198-1.x86_64.rpm"
    CHROME_FILE="google-chrome-stable-114.0.5735.198-1.x86_64.rpm"
    
    if [ -f "$CHROME_FILE" ]; then
        rm -f "$CHROME_FILE"
    fi
    
    log_warning "⚠️  注意：Chrome 114.x 是较旧的版本，可能存在安全漏洞"
    log_info "建议使用 Firefox 以获得更好的安全性和兼容性"
    read -p "是否继续安装 Chrome? (y/N): " -n 1 -r
    echo
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        log_info "已取消，建议使用 Firefox"
        return 0
    fi
    
    if ! wget -q "$CHROME_URL" -O "$CHROME_FILE"; then
        log_error "下载 Chrome 失败"
        log_info "可能的原因："
        log_info "  1. 网络连接问题"
        log_info "  2. 下载链接已失效"
        log_info "建议：使用 Firefox 替代"
        exit 1
    fi
    
    # 安装 Chrome
    log_info "安装 Chrome..."
    if yum localinstall -y "$CHROME_FILE" >/dev/null 2>&1; then
        log_success "✅ Chrome 安装成功"
        log_info "运行命令: google-chrome 或 chrome"
    else
        log_error "❌ Chrome 安装失败"
        log_info "可能的原因：GLIBC 版本不兼容"
        log_info "建议：使用 Firefox（./tools/install_browser_centos7.sh firefox）"
        rm -f "$CHROME_FILE"
        exit 1
    fi
    
    # 清理
    rm -f "$CHROME_FILE"
}

# 安装 Chromium
install_chromium() {
    log_info "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
    log_info "开始安装 Chromium..."
    log_info "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
    
    # 检查是否已安装
    if command -v chromium &> /dev/null || command -v chromium-browser &> /dev/null; then
        log_warning "Chromium 已安装"
        read -p "是否重新安装? (y/N): " -n 1 -r
        echo
        if [[ ! $REPLY =~ ^[Yy]$ ]]; then
            log_info "已取消"
            return 0
        fi
    fi
    
    # 安装 EPEL 仓库
    if ! rpm -q epel-release >/dev/null 2>&1; then
        log_info "安装 EPEL 仓库..."
        yum install -y epel-release >/dev/null 2>&1 || {
            log_error "EPEL 仓库安装失败"
            exit 1
        }
    fi
    
    # 更新缓存
    log_info "更新 yum 缓存..."
    yum makecache fast >/dev/null 2>&1 || yum makecache >/dev/null 2>&1 || true
    
    # 安装 Chromium
    log_info "安装 Chromium..."
    if yum install -y chromium >/dev/null 2>&1; then
        log_success "✅ Chromium 安装成功"
        log_info "运行命令: chromium 或 chromium-browser"
    else
        log_error "❌ Chromium 安装失败"
        log_info "可能的原因：EPEL 仓库中没有 Chromium 包"
        log_info "建议：使用 Firefox（./tools/install_browser_centos7.sh firefox）"
        exit 1
    fi
}

# 根据选择安装浏览器
case "$BROWSER_TYPE" in
    firefox)
        install_firefox
        ;;
    chrome)
        install_chrome
        ;;
    chromium)
        install_chromium
        ;;
esac

# 完成
log_info ""
log_info "=========================================="
log_success "✅ 安装完成！"
log_info "=========================================="
log_info ""
log_info "使用说明："
case "$BROWSER_TYPE" in
    firefox)
        log_info "  运行: firefox"
        log_info "  或: /opt/firefox/firefox"
        ;;
    chrome)
        log_info "  运行: google-chrome"
        log_info "  或: chrome"
        ;;
    chromium)
        log_info "  运行: chromium"
        log_info "  或: chromium-browser"
        ;;
esac
log_info ""

